# 导入异步IO相关库
import asyncio

# 导入asyncpg模块，用于异步操作PostgreSQL数据库。需要预先安装：pip install asyncpg
import asyncpg  # 需要安装: pip install asyncpg


# 定义异步数据库操作类
class AsyncDatabase:
    # 提供类说明
    """异步数据库操作"""

    # 类的初始化方法，设定连接字符串并初始化数据库连接池为None
    def __init__(self, connection_string):
        self.connection_string = connection_string
        self.pool = None

    # 定义异步的数据库连接方法
    async def connect(self):
        # 连接数据库，创建连接池
        """连接数据库"""
        self.pool = await asyncpg.create_pool(self.connection_string)
        # 输出连接池创建成功的信息
        print("数据库连接池已创建")

    # 定义异步关闭数据库连接池的方法
    async def close(self):
        # 关闭连接池（如已存在）
        """关闭连接"""
        if self.pool:
            await self.pool.close()
            # 输出连接池关闭的信息
            print("数据库连接池已关闭")

    # 定义异步执行SQL查询的方法
    async def execute_query(self, query, *args):
        # 执行SQL查询，并返回结果
        """执行查询"""
        # 从连接池获取连接，执行查询
        async with self.pool.acquire() as connection:
            result = await connection.fetch(query, *args)
            return result

    # 定义异步并发执行多条SQL查询的方法
    async def concurrent_queries(self, queries):
        # 并发执行多个查询
        """并发执行多个查询"""
        # 存放任务的列表
        tasks = []

        # 遍历所有查询，准备每个任务
        for i, (query, params) in enumerate(queries):
            task = self.execute_query(query, *params)
            tasks.append(task)

        # 输出开始并发查询的提示信息
        print("开始并发查询...")
        # 并发执行所有任务，等待结果
        results = await asyncio.gather(*tasks)
        # 输出所有查询完成的信息
        print(f"完成 {len(results)} 个查询")

        # 返回所有结果
        return results


# 定义一个用于模拟（不实际访问数据库）的异步数据库类
class MockAsyncDatabase:
    # 模拟异步数据库说明
    """模拟的异步数据库"""

    # 模拟异步执行SQL查询的方法
    async def execute_query(self, query, name, delay=1):
        # 输出开始执行的提示信息
        """模拟数据库查询"""
        print(f"{name}: 开始执行查询: {query}")
        # 异步睡眠以模拟耗时操作
        await asyncio.sleep(delay)  # 模拟数据库延迟
        # 输出查询完成信息
        print(f"{name}: 查询完成")
        # 返回模拟的查询结果
        return f"{name}_result"

    # 模拟并发执行多条SQL查询的方法
    async def concurrent_queries(self):
        # 并发查询演示说明
        """并发查询演示"""
        # 定义多个模拟查询
        queries = [
            ("SELECT * FROM users", "用户查询", 0.5),
            ("SELECT COUNT(*) FROM orders", "订单统计", 0.3),
            ("UPDATE products SET stock = stock - 1", "库存更新", 0.2),
            ("INSERT INTO logs (message) VALUES ('test')", "日志插入", 0.4),
        ]

        # 存放任务的列表
        tasks = []
        # 遍历所有查询，准备每个任务
        for query, name, delay in queries:
            task = self.execute_query(query, name, delay)
            tasks.append(task)

        # 并发执行所有任务，等待所有结果
        results = await asyncio.gather(*tasks)
        # 返回所有结果
        return results


# 定义演示数据库操作的主异步函数
async def database():
    # 数据库操作演示说明
    """数据库操作演示"""
    # 创建模拟数据库对象
    db = MockAsyncDatabase()
    # 调用并发查询方法并获取结果
    results = await db.concurrent_queries()
    # 打印所有查询结果
    print(f"所有查询结果: {results}")


# 执行主异步函数
asyncio.run(database())
